home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 August: Tool Chest / Dev.CD Aug 98 TC.toast / Sample Code / Snippets / Networking / AFP C++ / AFPCall.cp next >
Encoding:
Text File  |  1992-05-01  |  4.8 KB  |  223 lines  |  [TEXT/MPS ]

  1. /************************************************************
  2.  
  3. Created: Tuesday, November 6, 1991
  4.     AFPCall.cp
  5.     C++ Interface to the AppleTalk Filing Protocol
  6.     M.Vierling
  7.  
  8.  
  9.         Copyright Apple Computer, Inc. 1991-1992
  10.         All rights reserved
  11.  
  12. ************************************************************/
  13.  
  14. #include <Errors.h>
  15. #include "AFPCall.h"
  16.  
  17. #pragma segment AFPCall
  18.  
  19. const char kaspRetry = 10;
  20. const char kaspTimeout = 10;
  21. const Boolean kAsync = false;
  22.  
  23. TAFPCall::TAFPCall()
  24. {
  25.     this->Debug( 0, "AFPCall constructor:");
  26.  
  27.     fafpSCBPtr =         NULL;
  28.     fSessRefnum =         0;
  29.     fafpAttnRoutine =     NULL;
  30.     fioCompletion =     NULL;
  31.     fAspRetry =         kaspRetry;
  32.     fAspTimeout =         kaspTimeout;
  33. }
  34.  
  35. OSErr TAFPCall::IAFPCall()
  36. {
  37.     this->Debug( 0, "IAFPCall");
  38.     
  39.     fErrResult = noErr;
  40.     
  41.     if (fErrResult = MPPOpen())
  42.     {
  43.         this->Debug(fErrResult, "MPP Error: ");
  44.         return fErrResult;
  45.     }
  46.     if (fErrResult = ATPLoad())
  47.     {
  48.         this->Debug(fErrResult, "ATP Error: ");
  49.         return fErrResult;
  50.     }
  51.     if (fErrResult = OpenXPP( &fXPPRefNum ))
  52.     {
  53.         this->Debug(fErrResult, "XPP Error: ");
  54.         return fErrResult;
  55.     }
  56.     
  57.     if ((fParamPtr = new XPPParamBlock) == nil) {
  58.         return( fErrResult = 1);
  59.     }
  60.     
  61.     fParamPtr->GETPARM.ioRefNum = fXPPRefNum;
  62.  
  63.     if (fErrResult = ASPGetParms(fParamPtr, kAsync)) {
  64.         delete fParamPtr;
  65.         return fErrResult;
  66.     } else {
  67.         fMaxCommandSize = fParamPtr->GETPARM.aspMaxCmdSize;
  68.         fMaxQuantumSize = fParamPtr->GETPARM.aspQuantumSize;
  69.     }
  70.  
  71.     return fErrResult;
  72. }
  73.  
  74. TAFPCall::~TAFPCall()
  75. {
  76.     this->Debug(0, "AFPCall destructor:");
  77.     if (fafpSCBPtr != NULL)
  78.     {
  79.         this->DoLogout();
  80.     }
  81.     delete fParamPtr;
  82. }
  83.  
  84. void TAFPCall::Debug( OSErr /*theErr*/, const char * /*message*/ )
  85. {
  86. }
  87.  
  88. OSErr TAFPCall::SetError()
  89. {
  90.     if (fErrResult)
  91.     {
  92.         this->Debug(fErrResult, "System Error: ");
  93.         return fErrResult;
  94.     }
  95.     fErrResult = (OSErr)fParamPtr->XPP.cmdResult;
  96.     if (fErrResult)
  97.     {
  98.         this->Debug(fErrResult, "AFP Error: ");
  99.         return fErrResult;
  100.     }
  101.     return fErrResult;
  102. }
  103.  
  104. void TAFPCall::IParamBlock()
  105. {
  106.     fParamPtr->XPP.cmdResult =            0;
  107.     fParamPtr->XPP.ioRefNum =             fXPPRefNum;
  108.     fParamPtr->XPP.csCode =             afpCall;
  109.     fParamPtr->XPP.ioCompletion =         fioCompletion;
  110.     fParamPtr->XPP.sessRefnum =         fSessRefnum;
  111.     fParamPtr->XPP.aspTimeout =         fAspTimeout;
  112.     fParamPtr->XPP.aspRetry =            fAspRetry;
  113. }
  114.  
  115. OSErr TAFPCall::DoAFPCommand( XPPParmBlkPtr theParamPtr )
  116. {
  117.     fErrResult = AFPCommand( theParamPtr, kAsync );
  118.     this->SetError();
  119.     return fErrResult;
  120. }
  121.  
  122. OSErr TAFPCall::DoCommand( Ptr cbPtr, unsigned short cbSize,
  123.                            Ptr rbPtr, unsigned short rbSize )
  124. {
  125.     if (fSessRefnum == 0)
  126.     {
  127.         this->Debug(0, "### AFPCall Error: afp session does not exist");
  128.         return( fErrResult = aspParamErr);
  129.     }
  130.     this->IParamBlock();
  131.     
  132.     fParamPtr->XPP.cbSize =             cbSize;
  133.     fParamPtr->XPP.cbPtr    =             cbPtr;
  134.     fParamPtr->XPP.rbSize =             rbSize;
  135.     fParamPtr->XPP.rbPtr    =             rbPtr;
  136.  
  137.     this->DoAFPCommand( fParamPtr );
  138.     return fErrResult;
  139. }
  140.  
  141. OSErr TAFPCall::DoWrite( Ptr cbPtr, unsigned short cbSize,
  142.                          Ptr rbPtr, unsigned short rbSize,
  143.                          Ptr wdPtr, unsigned short wdSize )
  144. {
  145.     if (fSessRefnum == 0)
  146.     {
  147.         this->Debug(0, "### AFPCall Error: afp session does not exist");
  148.         return( fErrResult = aspParamErr);
  149.     }
  150.     this->IParamBlock();
  151.     
  152.     fParamPtr->XPP.cbSize =             cbSize;
  153.     fParamPtr->XPP.cbPtr =                 cbPtr;
  154.     fParamPtr->XPP.rbSize =             rbSize;
  155.     fParamPtr->XPP.rbPtr =                 rbPtr;
  156.     fParamPtr->XPP.wdPtr =                 wdPtr;
  157.     fParamPtr->XPP.wdSize =                wdSize;
  158.  
  159.     this->DoAFPCommand( fParamPtr );
  160.     return fErrResult;
  161. }
  162.  
  163. OSErr TAFPCall::DoGetStatus( Ptr rbPtr, unsigned short rbSize, AddrBlock addrBlock )
  164. {
  165.     this->IParamBlock();
  166.  
  167.     fParamPtr->XPP.csCode                    = getStatus;    // Kludge because AppleTalk.h didn't inlude enough structs
  168.     fParamPtr->OPEN.serverAddr                = addrBlock;    // AppleTalk.h should define an ASPGetStatus struct
  169.     fParamPtr->XPP.rbSize                    = rbSize;
  170.     fParamPtr->XPP.rbPtr                    = rbPtr;
  171.     
  172.     fErrResult = ASPGetStatus( fParamPtr, kAsync );
  173.     this->SetError();
  174.     return fErrResult;
  175. }
  176.  
  177. OSErr TAFPCall::DoLogin( Ptr cbPtr, unsigned short cbSize,
  178.                          Ptr rbPtr, unsigned short rbSize, AddrBlock addrBlock )
  179. {
  180.     this->IParamBlock();
  181.  
  182.     fafpSCBPtr = (Ptr)(new char[scbMemSize]); /* alloc block for scb */
  183.  
  184.     fParamPtr->LOGIN.afpAddrBlock    = addrBlock;
  185.     fParamPtr->LOGIN.afpSCBPtr        = fafpSCBPtr;
  186.     fParamPtr->LOGIN.afpAttnRoutine    = 0;
  187.     
  188.     fParamPtr->LOGIN.cbSize    = cbSize;
  189.     fParamPtr->LOGIN.cbPtr    = cbPtr;
  190.     fParamPtr->LOGIN.rbSize    = rbSize;
  191.     fParamPtr->LOGIN.rbPtr    = rbPtr;
  192.  
  193.     this->DoAFPCommand( fParamPtr );
  194.     if ( fErrResult == 0 || fErrResult == -5001 )
  195.         fSessRefnum = fParamPtr->LOGIN.sessRefnum;
  196.     else
  197.     {
  198.         delete fafpSCBPtr;
  199.         fafpSCBPtr = NULL;
  200.         fSessRefnum = 0;
  201.     }
  202.     return fErrResult;
  203. }
  204.  
  205. OSErr TAFPCall::DoLogout()
  206. {
  207.     Byte command = afpLogout;
  208.     short reply;
  209.     
  210.     if ( this->DoCommand( (Ptr)&command, 1, (Ptr)&reply, 2 ) == 0 )
  211.     {
  212.         this->Debug(0, "Closing ASP Session");
  213.         delete fafpSCBPtr;
  214.         fafpSCBPtr = NULL;
  215.         fSessRefnum = 0;
  216.         return 0;
  217.     }
  218.     else
  219.     {
  220.         return fErrResult;
  221.     }
  222. }
  223.